package com.furn.controller;

import com.furn.bean.Furn;
import com.furn.bean.Msg;
import com.furn.service.FurnService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author:张锦波
 * @date:2024-08-01
 * @description:
 */
@Controller
public class FurnController {
    //注入一个FurnService
    @Resource
    private FurnService furnService;


    /**
     * 响应客户端的添加请求
     *
     * @Validated :表示要对传入的数据进行校验
     * @RequestBody :使用springmvc的@RequestBody
     * 可以将客户端提交的json格式数据封装成javaBean
     * @ResponseBody : 服务器返回的数据格式是按照json的格式返回的
     * (底层是按照http协议进行协商)
     */
    @PostMapping("/save")
    @ResponseBody
    public Msg save(@Validated @RequestBody Furn furn, Errors errors) {
        Map<String, Object> map = new HashMap<>();
        List<FieldError> fieldErrors = errors.getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        if (map.isEmpty()) {//如果为空，就表示代码没有错误
            furnService.save(furn);
            //返回成功Msg
            return Msg.success();
        } else {//校验失败，返回失败信息
            return Msg.fail().add("errorMsg", map);
        }
    }

    @ResponseBody
    @RequestMapping("/furns")
    public Msg findAll() {
        List<Furn> furnList = furnService.findAll();
        Msg msg = Msg.success();
        //把家具信息封装到msg中
        msg.add("furnList", furnList);
        return msg;
    }

    @ResponseBody
    @PutMapping("/update")
    public Msg update(@RequestBody Furn furn) {
        furnService.update(furn);
        Msg success = Msg.success();
        return success;
    }

    @ResponseBody
    @DeleteMapping("/delete/{id}")
    public Msg delete(@PathVariable Integer id) {
        furnService.delete(id);
        return Msg.success();
    }

    @ResponseBody
    @RequestMapping("/findFurn/{id}")
    public Msg findFurnById(@PathVariable Integer id) {
        Furn furn = furnService.findFurnById(id);
        Msg msg = Msg.success();
        msg.add("furn", furn);
        return msg;
    }

    /**
     * @param pageNum  表示当前是第几页(默认是第1页)
     * @param pageSize 表示一页需要几条记录(默认是5条)
     * @return
     */
    @RequestMapping("/furnsByPage")
    @ResponseBody
    public Msg listFurnsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
                               @RequestParam(defaultValue = "5") Integer pageSize) {
        //设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        //1.调用findAll是完成查询，底层会进行物理分页，而不是逻辑分页
        //2.会根据分页的参数来计算limit ？，？,在发出SQL语句时，会带上limit
        List<Furn> furns = furnService.findAll();
        //将分页查询的结果，分装到PageInfo
        //PageInfo中包含了分页的各种信息，比如当前页面，共有多少条记录
        PageInfo pageInfo = new PageInfo(furns, pageSize);
        //将pageInfo信息封装到Msg中
        return Msg.success().add("pageInfo", pageInfo);

    }

    /**
     * 通过家具名进行分页查询
     *
     * @param pageNum
     * @param pageSize
     * @param search   查询的家具名称，默认是个空串，即查询所有
     * @return
     */
    @RequestMapping("/furnsByConditionPage")
    @ResponseBody
    public Msg listFurnsByConditionPage(@RequestParam(defaultValue = "1") Integer pageNum,
                                        @RequestParam(defaultValue = "5") Integer pageSize,
                                        @RequestParam(defaultValue = "") String search) {
        //设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        //1.调用findAll是完成查询，底层会进行物理分页，而不是逻辑分页
        //2.会根据分页的参数来计算limit ？，？,在发出SQL语句时，会带上limit
        List<Furn> furns = furnService.findByCondition(search);
        //将分页查询的结果，分装到PageInfo
        //PageInfo中包含了分页的各种信息，比如当前页面，共有多少条记录
        PageInfo pageInfo = new PageInfo(furns, pageSize);
        //将pageInfo信息封装到Msg中
        return Msg.success().add("pageInfo", pageInfo);

    }
}
